package com.example.cloudgateway.predicate;

import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;

import java.time.LocalTime;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

/**
 * 时间判断断言工厂类
 */
@Component
public class FlashKillingTimeRoutePredicateFactory extends AbstractRoutePredicateFactory<FlashKillingTimeConfig> {


    public FlashKillingTimeRoutePredicateFactory() {
        super(FlashKillingTimeConfig.class);
    }

    /**
     * 进行判断逻辑代码
     * @param config
     * @return
     */
    @Override
    public Predicate<ServerWebExchange> apply(FlashKillingTimeConfig config) {
        LocalTime start = config.getStart();
        LocalTime end = config.getEnd();
        return new Predicate<ServerWebExchange>() {
            @Override
            public boolean test(ServerWebExchange serverWebExchange) {
                String uri = serverWebExchange.getRequest().getURI().getPath();
                if (uri.equals("/product/flash/killing")) {
                    LocalTime now = LocalTime.now();
                    return now.isAfter(start) && now.isBefore(end);
                }
                return true;
            }
        };
    }

    /**
     * 配置文件中的参数 下午09:00,下午09:10  相当于
     *                   start   , end
     * 如果需要多个参数 那么后面还可以添加就好了
     * 这里面的名称 也一定要和 我们实体类里面 定义的名称一样
     *
     * 用来映射参数，asList("配置文件的第1个参数","配置文件的第2个参数","配置文件的第3个参
     * 数","配置文件的第4个参数"....)，接给配置类。
     * @return
     */
    @Override
    public List<String> shortcutFieldOrder() {
        return Arrays.asList("start", "end");
    }


}
